/**
 * @file      : spi.h
 * @author    : huenrong (huenrong1028@gmail.com)
 * @date      : 2020-05-30 15:30:41
 *
 * @copyright : Copyright (c) 2020  胡恩荣
 *
 */

#ifndef __SPI_H
#define __SPI_H

#include <stdint.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <error.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#include <unistd.h>
#include <string.h>

#define SPI_SPEED 8000000   // spi最大速率
#define SPI_BITS_PER_WORD 8 // spi一个字节的位数

#define SPI_MAX_TRANSFER_LEN 28 // spi单次最大传输长度

/**
 * @brief  打开spi设备
 * @param  spi_dev_path: spi设备路径(如: /dev/spidev2.0)
 * @param  spi_mode: spi模式(SPI_MODE_0, SPI_MODE_1, SPI_MODE_2, SPI_MODE_3)
 * @return 成功: 返回设备文件描述符
 *         失败: -1
 */
int spi_open(const char *spi_dev_path, const int spi_mode);

/**
 * @brief  关闭spi设备
 * @param  fd: 设备文件描述符
 * @return 成功: 0
 *         失败: -1
 */
int spi_close(const int fd);

/**
 * @brief  spi发送1字节数据
 * @param  fd: 设备文件描述符
 * @param  reg_addr: 寄存器地址
 * @param  write_data: 发送数据
 * @return 成功: 0
 *         失败: -1
 */
int spi_write_byte(const int fd, const uint8_t reg_addr, const uint8_t write_data);

/**
 * @brief  spi发送n字节数据(n > 1)
 * @param  fd: 设备文件描述符
 * @param  reg_addr: 寄存器地址
 * @param  write_data: 发送数据
 * @param  write_data_len: 发送数据长度
 * @return 成功: 0
 *         失败: -1
 */
int spi_write_nbyte(const int fd, const uint8_t reg_addr,
                    const uint8_t *write_data, const uint32_t write_data_len);

/**
 * @brief  spi读取1字节数据
 * @param  read_data: 读取到的数据
 * @param  fd: 设备文件描述符
 * @param  reg_addr: 寄存器地址
 * @return 成功: 0
 *         失败: -1
 */
int spi_read_byte(uint8_t *read_data, const int fd, const uint8_t reg_addr);

/**
 * @brief  spi读取n字节数据(n > 1)
 * @param  read_data: 读取到的数据
 * @param  fd: 设备文件描述符
 * @param  reg_addr: 寄存器地址
 * @param  read_data_len: 指定读取的长度
 * @retval 成功: 0
 *         失败: -1
 */
int spi_read_nbyte(uint8_t *read_data, const int fd,
                   const uint8_t reg_addr, const uint16_t read_data_len);

#endif
